package cj188

import (
	"bytes"
	"fmt"
	"strconv"
	"szkis/simu/utils"
)

// 水表
var TYPE_WATER = 0x10 
// 燃气表
var TYPE_GAS = 0x30

// 188 协议
type Cj188Packet struct {
	Prefix byte 		// 1byte
	Type  byte			// 1byte 
	Addr string			// 7byte
	Control byte		// 1byte 
	Len int 			// 1byte 数据域长度
	Di []byte 			// 2byte 数据域标识 901F/1F90
	Ser byte  			// 1byte 序号
	Cs byte 			// 1byte 校验和

	// 读取数据
	CurData		float64	// 4byte 累计量 后跟计量单位1byte
	Unc			byte    // 1byte 2C为吨
	DayData		float64 // 4byte 当日量 后跟计量单位1byte
	RealTime	string  // 7byte 
	Status0		int     // 1byte 表计状态

	SuccessFlag bool 	// 读表成功标志
}

func ParsePacket(data []byte) *Cj188Packet {
	ret := &Cj188Packet{

		SuccessFlag: false,
	}

	// 1. 清除前导fe
	bs := utils.ClearFE(data)
	if len(bs) < 12 {
		return ret
	}

	// 2. 地址
	ret.Addr = utils.BytesToHex( utils.BytesReverse(bs[2:9]) )
	ret.Type = bs[1]
	ret.Control = bs[9]	

	// 3. 读表?
	if ret.Control == 0x81 {
		ret.Len = int(bs[10])
		ret.Di = bs[11:13]
		ret.Ser = bs[13]
		dataStr := utils.BytesToHex(utils.BytesReverse(bs[14:18]))
		num, err := strconv.Atoi(dataStr)
		if err != nil {
			return ret 
		}

		fdata :=  0.01 * float64(num)
		ret.CurData, _ =   strconv.ParseFloat(fmt.Sprintf("%.2f", fdata), 64)
		ret.SuccessFlag = true 
		return ret
	}

	return ret
}

// 读表
func ReadMeter(addr string) []byte {
	buf := bytes.Buffer{}
	buf.WriteByte(0x68)
	buf.WriteByte(0x10)
	buf.Write(utils.BytesReverse(utils.HexToBytes(addr)))
	buf.WriteByte(0x01)
	buf.WriteByte(0x03)
	buf.Write([]byte{0x90, 0x1F})
	buf.WriteByte(0x00)
	buf.WriteByte(utils.Cs(buf.Bytes()))
	buf.WriteByte(0x16)
	return buf.Bytes()
}

// 设置底度
func SetCurrentData(addr string, data float64) []byte {
	buf := bytes.Buffer{}
	buf.WriteByte(0x68)
	buf.WriteByte(0x10)
	buf.Write(utils.BytesReverse(utils.HexToBytes(addr)))
	buf.WriteByte(0x16)
	buf.WriteByte(0x08)
	buf.Write([]byte{0x16, 0xA0})   
	buf.WriteByte(0x00)
	buf.WriteByte(0x00)
	buf.Write(utils.BytesReverse(utils.HexToBytes(fmt.Sprintf("%8.0f", data * 100))))
	buf.WriteByte(utils.Cs(buf.Bytes()))
	buf.WriteByte(0x16)
	return buf.Bytes()
}